<?php


namespace App\Service\OpenShop\Feishu;


use App\Enums\OpenShop\InvestmentPromotion\ErrCode;
use App\Enums\OpenShop\InvestmentPromotion\MainProcessEnum;
use App\Enums\OpenShop\MissionTemplateEnum;
use App\Exceptions\Custom\CustomHttpResponseException;
use App\Models\OpenShop\InvestmentPromotion\OpenShopSiteMissionModel;
use App\Service\OpenShop\Import\HistoryOrder\HistoryOrderParam;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Jenssegers\Agent\Agent;

class MessageService extends BaseService
{

    /**
     * 完成通知前缀
     *
     * @var string
     */
    const  FINISH_TITLE_PREFIX = "【完成通知】";


    /**
     * 待处理通知前缀
     *
     * @var string
     */
    const  STAY_TITLE_PREFIX = "【待处理通知】";

    /**
     * 默认待处理任务标题
     *
     * @var string
     */
    const DEFAULT_STAY_TITLE = "**".self::STAY_TITLE_PREFIX."您有一条任务待处理！**";



    // 飞书字段映射表
    public const MESSAGE_FIELD_TEXT = [
        'missionType'      => '任务类型',
        'missionName'      => '任务名称',
        'missionTimeDeal'  => '任务处理时间',
        'missionTimeStart' => '任务创建时间',
        'missionTimeEnd'   => '任务截止时间',
        'orderNo'          => '开店订单号',
        'shopCode'         => '门店编号',
        'shopName'         => '门店名称',
        'dealUsername'     => '任务处理人',
        'dealUserRole'     => '任务处理角色',
        'approval'         => '审批意见',
    ];

    /**
     * 通用飞书任务处理消息推送
     *
     * @param array $field
     * @param array $receiverFeishuUserId
     * @param string $url
     * @param string $text
     */
    public function sendCommonJob(
        array $field,
        array $receiverFeishuUserId,
        string $url = '',
        string $text = self::DEFAULT_STAY_TITLE
    ) {
        if (HistoryOrderParam::$importOrderMode) {
            return;
        }

        $fs = new MessageSendService();
        $fs = $fs->setText($text)
                 ->setUrl($url)
                 ->setReceiveFeiShuIds($receiverFeishuUserId);

        $fieldKey = array_keys(self::MESSAGE_FIELD_TEXT);

        foreach ($field as $key => $one) {
            if (in_array($key, $fieldKey)) {
                $fs = $fs->setField(self::MESSAGE_FIELD_TEXT[$key], $one);
            }
        }

        $fs->send();
    }

    /**
     * 指派空间设计师
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function assignSpaceDesign(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '上传空间设计图')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    public static function spaceDesignJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt,
        string $missionType = '审批',
        string $missionName = ''
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', $missionType)
           ->setField('任务名称', $missionName)
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 筹备确认
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function spaceDesignJobHistory(
        array $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url,
        string $missionName,
        string $employeeType = '员工'
    ) {
        $fs = new MessageSendService();
        $fs->setText('**' .MessageService::FINISH_TITLE_PREFIX. $missionName . '**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', $employeeType)
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds($receiverFeishuUserId)
           ->setUrl($url)
           ->send();
    }


    /**
     * @param string $receiverFeishuUserId 接收者id
     * @param string $orderNo 订单编号
     * @param string $merchantName 商家姓名
     * @param string $money 付款金额
     * @param string $payTime 付款时间 Y-m-d H:i:s
     * @param string $paySerialNum 付款流水号
     * @param string $url 订单详情链接
     * @throws GuzzleException
     */
    public static function paySuccessNotice(
        string $receiverFeishuUserId,
        string $orderNo,
        string $merchantName,
        string $money,
        string $payTime,
        string $paySerialNum,
        string $url = ''
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'商家完成合同支付**')
           ->setField('开店订单号', $orderNo)
           ->setField('商家姓名', $merchantName)
           ->setField('付款金额', "￥{$money}元")
           ->setField('付款时间', $payTime)
           ->setField('付款流水号', $paySerialNum)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 商家完成部分合同签署
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $ContractNo 合同编号
     * @param string $merchantName 商家姓名
     * @param string $url 开店订单详情地址
     * @throws GuzzleException
     */
    public static function completePartialContractNotice(
        string $receiverFeishuUserId,
        string $orderNo,
        string $ContractNo,
        string $merchantName,
        string $url
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'商家完成部分合同签署（技术服务合同）**') // 内容标题
           ->setField('开店订单号', $orderNo) // 内容
           ->setField('合同编号', $ContractNo) // 内容
           ->setField('商家姓名', $merchantName) // 内容
           ->setReceiveFeiShuIds([$receiverFeishuUserId]) //  飞书接收人
           ->setUrl($url) // 展示的 url
           ->send();
    }

    /**
     * 商家完成所有合同签署
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $ContractNo 合同编号
     * @param string $shopNo 店铺编号
     * @param string $merchantName 商家姓名
     * @param string $url 跳转到开店订单详情-合同信息
     * @throws GuzzleException
     */
    public static function completeAllContractsNotice(
        string $receiverFeishuUserId,
        string $orderNo,
        string $ContractNo,
        string $shopNo,
        string $merchantName,
        string $url = ''
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'商家完成所有合同签署**')
           ->setField('开店订单号', $orderNo)
           ->setField('合同编号', $ContractNo)
           ->setField('门店编号', $shopNo)
           ->setField('商家姓名', $merchantName)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 指派开发经理参与人员
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function assignManagerHistory(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'指派开发顾问**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 合同签署失败
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $contractNo 合同编号
     * @param string $merchantName 商家姓名
     * @param string $url 跳转到开店订单详情-合同信息
     * @throws GuzzleException
     */
    public static function contractError(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $contractNo,
        string $merchantName,
        string $url = ''
    ) {
        $fs = new MessageSendService();
        $fs->setText('**合同签署失败**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('合同编号', $contractNo)
           ->setField('商家姓名', $merchantName)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 筹备确认
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function preparationConfirmation(
        array $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url,
        string $missionName = '',
        string $employeeType = '员工'
    ) {
        $fs = new MessageSendService();
        $fs->setText('**' .MessageService::FINISH_TITLE_PREFIX. $missionName . '**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', $employeeType)
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds($receiverFeishuUserId)
           ->setUrl($url)
           ->send();
    }

    /**
     * 指派空间设计师
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function assignSpaceDesignHistory(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'指派空间设计师**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 任务处理 历史推送
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function taskHandleHistory(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url,
        string $missionName = ''
    ) {
        $fs = new MessageSendService();
        $fs->setText('**' .MessageService::FINISH_TITLE_PREFIX. $missionName . '**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 指派开发经理任务
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function assignManagerJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务名称', '选址报告上传')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 上传空间设计图
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function uploadDesignMappingData(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'上传空间设计图**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 筹备部确认施工进场
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function engineeringStart(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'筹备部确认施工进场**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 筹备部确认施工进场
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function engineeringOk(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {

        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'筹备部确认施工完成**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 指派营运督导
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function acceptAssignManager(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '营运部验收确认')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 营运部验收确认
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function managerConfirmSubmit(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {

        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'营运部验收确认**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 指派营运督导参与人员
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function acceptAssignManagerHistory(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {

        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'指派营运督导**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 选址报告上传
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function locationUploaded(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {

        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '门店待确认选址信息')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 选址报告上传参与人员
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function locationUploadedHistory(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {

        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'选址报告上传**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '员工')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 门店已经确认选址
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function locationConfirmed(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '筹备待确认')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 门店已经确认选址参与人员
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $updatedAt
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $title
     * @throws GuzzleException
     */
    public static function locationConfirmedHistory(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $updatedAt,
        string $url
    ) {
        $fs = new MessageSendService();
        $fs->setText('**'.MessageService::FINISH_TITLE_PREFIX.'门店已经确认选址**')
           ->setField('开店订单号', $orderNo)
           ->setField('门店编号', $shopNo)
           ->setField('任务处理角色', '商家')
           ->setField('任务处理人', $preparationName)
           ->setField('任务处理时间', $updatedAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 筹备确认
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function preparationConfirmationJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '指派空间设计师')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 上传设计图任务
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function uploadDesignMappingDataJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '筹备部确认施工进场')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 筹备部确认施工进场
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function engineeringStartJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '筹备部确认施工完成')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }

    /**
     * 筹备部确认施工完成
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function engineeringOkJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '指派营运督导')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 门店已经确认选址
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function managerConfirmSubmitJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '督导已完成验收')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();
    }


    /**
     * 签合同任务
     * @param string $receiverFeishuUserId
     * @param string $orderNo 开店订单号
     * @param string $shopNo 店铺编号
     * @param string $preparationName 筹备负责人名字
     * @param string $url 跳转到开店订单详情-合同信息
     * @param string $shopName
     * @param string $startAt
     * @param string $endAt
     * @throws GuzzleException
     */
    public static function signedJob(
        string $receiverFeishuUserId,
        string $orderNo,
        string $shopNo,
        string $preparationName,
        string $url,
        string $shopName,
        string $startAt,
        string $endAt
    ) {
        $fs = new MessageSendService();
        $fs->setText(self::DEFAULT_STAY_TITLE)
           ->setField('开店订单号', $orderNo)
           ->setField('任务类型', '审批')
           ->setField('任务名称', '指派开发顾问')
           ->setField('门店编号', $shopNo)
           ->setField('门店名称', $shopName)
           ->setField('任务处理人', $preparationName)
           ->setField('任务创建时间', $startAt)
           ->setField('任务截止时间', $endAt)
           ->setReceiveFeiShuIds([$receiverFeishuUserId])
           ->setUrl($url)
           ->send();

    }

    /**
     * @param array $content
     * @param array $receiverFeishuUserId
     * @param string $url
     * @param string $msgTitle
     * @param string $urlText
     */
    public function sendMsg(
        array $content,
        array $receiverFeishuUserId,
        string $url,
        string $msgTitle,
        string $urlText = "",
        string $module = ''
    ) {
        if (!empty($receiverFeishuUserId)) {
            $fs = new MessageSendService();
            $fs = $fs->setText($msgTitle)
                     ->setModule($module)
                     ->batchSetField($content)
                     ->setUrl($url, $urlText)
                     ->setReceiveFeiShuIds($receiverFeishuUserId);
            $fs->send();
        }
    }

    public static function sendBoard(Request $request, int $missionId)
    {
        $siteMission = OpenShopSiteMissionModel::query()->find($missionId);
        if (!$siteMission) {
            throw new CustomHttpResponseException(
                ErrCode::errCodeTrans(ErrCode::CODE_ERR_NO_SITE_MISSION)
            );
        }

        $agent = new Agent();
        $agent->setUserAgent($request->header('user-agent'));
        $agent->setHttpHeaders($request->headers->all());
        $isDesktop = $agent->isDesktop();

        // PC
        if ($isDesktop) {
            return BaseService::getOrderInfoWenAppUrl($siteMission->orderNo, $missionId);
        }

        // 开店小程序的类型
        if (in_array($siteMission->stepStatus, MissionTemplateEnum::OPEN_MISSION_LISTS)) {
            return BaseService::getOpenAppletUrl($missionId);
        }

        // 选址小程序的任务类型
//        if (in_array($siteMission->stepStatus, MissionTemplateEnum::SITE_LOCATION_LISTS)) {
//            return BaseService::getSiteLocationAppletUrl($missionId);
//        }

        // PC
        return BaseService::getOrderInfoWenAppUrl($siteMission->orderNo, $missionId);
    }
}
